import os
import uuid
import time
import argparse


def rclone_disk(diskname, base_dir, rclone_dir=None, cache_str='500M', transfers=10, cache_dir=''):
    full_dir = os.path.join(base_dir, diskname)
    if not os.path.exists(full_dir):
        os.makedirs(full_dir)
    cur_dir = os.curdir
    tmpname = str(uuid.uuid1())
    if cache_dir:
        extern_op = '--cache-dir %s' % cache_dir
    else:
        extern_op = ''
    cmd = 'nohup rclone mount %s: %s --dir-cache-time 1h --cache-chunk-total-size %s --transfers=%d --allow-non-empty --vfs-cache-mode minimal %s> /dev/null & echo $! > /tmp/%s ' % (
    diskname, full_dir, cache_str, transfers, extern_op, tmpname)
    if rclone_dir:
        cmd = 'cd %s && ' % rclone_dir + cmd  # + ' && cd %s' % cur_dir
    print(cmd, tmpname)
    # os.system(cmd)
    with open('/tmp/%s' % tmpname, 'r') as f:
        pid = f.read()
    # print(pid)
    os.remove('/tmp/%s' % tmpname)
    return pid


def rclone_free(base_dir, pid='', diskname='', clear_cache=True):
    print('rcloe free', base_dir, pid)

    if diskname:
        fullname = os.path.join(base_dir, diskname)
        cmd = 'fusermount -u %s' % fullname
        print(cmd)
        # os.system(cmd)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--mode', type=str, default='')
    parser.add_argument('--disk_name', type=str, default='')
    parser.add_argument('--base_dir', type=str, default='')
    parser.add_argument('--target_dir', type=str, default='')
    parser.add_argument('--out_dir', type=str, default='')
    parser.add_argument('--num_process', type=int, default=20)
    parser.add_argument('--disk_start', type=int, default=10000)
    parser.add_argument('--disk_end', type=int, default=10090)
    parser.add_argument('--rclone_cache_dir', type=str, default='')
    args = parser.parse_args()
    mod = args.mode

    if args.mode == 'disk_mount':
        disk_names = []
        for x in range(args.disk_start, args.disk_end):
            disk_names.append('gg' + str(x).zfill(2))
        for disk_name in disk_names:
            rclone_disk(disk_name, args.base_dir, cache_str='1000m', cache_dir=args.rclone_cache_dir)
        time.sleep(10)
    elif args.mode == 'disk_unmount':
        disk_names = []
        for x in range(args.disk_start, args.disk_end):
            disk_names.append('gg' + str(x).zfill(2))
        for disk_name in disk_names:
            rclone_free(args.base_dir, '', disk_name)

# python3 rclone_disk_mount.py --mode disk_mount --disk_start 1 --disk_end 11 --base_dir /root/gg01_05
